package com.xbstar.wei.service2;
/**
 * 提供对微信xml数据转换成map的一系列方法及互转
 * @author jwf
 * @version 1.0
 */
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.dom4j.*;
import org.dom4j.io.SAXReader;
public class JFAPIXml2Map {
	private	String xmlStr;

	public String getXmlStr() {
		return xmlStr;
	}

	public void setXmlStr(String xmlStr) {
		this.xmlStr = xmlStr;
	}
	/**
	 * 从request中获得xml后转化为map对象
	 * @param request
	 * @return 返回一个格式良好的map类，如果获得的格式不良好，则返回空
	 */
	public Map<String, Object> getAWeiMapByRequest( HttpServletRequest request){
		InputStream inputStream=null;
		try {
			inputStream = request.getInputStream();
		} catch (IOException e1) {
			
			e1.printStackTrace();
		}
		SAXReader reader = new SAXReader();
		Document doc=null;
		try {
			doc = reader.read(inputStream);
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		if(doc==null)return null;
		Element root=doc.getRootElement();
		if (root.getName().equals("xml")) {
			HashMap<String, Object>map=new HashMap<String, Object>();
			for(Iterator it=root.elementIterator();it.hasNext();){       
		        Element element = (Element) it.next();
		        if (!element.getName().equals("Articles")) {
		        	
		        	map.put(element.getName(), element.getText());
				}else {
					ArrayList<HashMap<String,String>>list=new ArrayList<HashMap<String,String>>();
					for (Iterator ie=element.elementIterator();ie.hasNext();) {//获得多个item
						Element item= (Element) ie.next();
						HashMap<String, String>ttmap=null;
						if (item.getName().equals("item")) {//确认是否为item
							ttmap=new HashMap<String, String>();
							for (Iterator itemcon=item.elementIterator();itemcon.hasNext();){//对每个item进行处理
								Element itmTTcon= (Element) itemcon.next();
								ttmap.put(itmTTcon.getName(), itmTTcon.getText());
							}
						}
						if (ttmap!=null) {
							list.add(ttmap);
						}
						
					}
					map.put(element.getName(), list);
				}
		        
			}
			try {
				if (isAgoodMapFormat(map)) {
					return map;		
				}
			} catch (Exception e) {
				e.printStackTrace();
				return null;
					
			}
			
		}
		return null;
		
	}
	/**
	 * 获取微信信息的map
	 * @param xml xml形式的字符串
	 * @return 正确返回map，错误返回null
	 */
	public Map<String, Object> getAWeiMapByXMLString(String xml) {
		this.xmlStr=xml;
		try {
			Document doc=DocumentHelper.parseText(xmlStr);
			Element root=doc.getRootElement();
			if (root.getName().equals("xml")) {
				HashMap<String, Object>map=new HashMap<String, Object>();
				for(Iterator it=root.elementIterator();it.hasNext();){       
			        Element element = (Element) it.next();
//			        String nameTTStr=element.getName();
//			        if (nameTTStr.equals("CreateTime")||nameTTStr.equals("MsgId")||nameTTStr.equals("Location_X")||nameTTStr.equals("Location_Y")||nameTTStr.equals("Scale")) {
//			        	map.put(element.getName(), element.getText());
//					}else if (nameTTStr.equals("Latitude")||nameTTStr.equals("Longitude")||nameTTStr.equals("Precision")) {
//						map.put(element.getName(), element.getText());
//					}
			        if (!element.getName().equals("Articles")) {
			        	
			        	map.put(element.getName(), element.getText());
					}else {
						ArrayList<HashMap<String,String>>list=new ArrayList<HashMap<String,String>>();
						for (Iterator ie=element.elementIterator();ie.hasNext();) {//获得多个item
							Element item= (Element) ie.next();
							HashMap<String, String>ttmap=null;
							if (item.getName().equals("item")) {//确认是否为item
								ttmap=new HashMap<String, String>();
								for (Iterator itemcon=item.elementIterator();itemcon.hasNext();){//对每个item进行处理
									Element itmTTcon= (Element) itemcon.next();
									ttmap.put(itmTTcon.getName(), itmTTcon.getText());
								}
							}
							if (ttmap!=null) {
								list.add(ttmap);
							}
							
						}
						map.put(element.getName(), list);
					}
			        
				}
				try {
					if (isAgoodMapFormat(map)) {
						return map;		
					}
				} catch (Exception e) {
					e.printStackTrace();
					return null;
						
				}
				
			}
		} catch (DocumentException e) {
			e.printStackTrace();
			return null;
		}
		return null;
		
	}
	/**
	 * 判断是否为正确的微信格式
	 * @param map 要判断的map
	 * @return 如果都正确返回true，否则将抛出异常
	 * @throws Exception
	 */
	private boolean isAgoodMapFormat(HashMap<String, Object> map) throws Exception {
		String from=(String)map.get("FromUserName");
		String to=(String)map.get("ToUserName");
		String time=""+map.get("CreateTime");
		String type=(String)map.get("MsgType");
		if (from==null||from.equals("")) {
			System.out.println("不符合微信格式，缺少FromUserName");
			Exception ex=new Exception("不符合微信格式，缺少FromUserName");
			throw ex;
		}
		if (to==null||to.equals("")) {
			System.out.println("不符合微信格式，缺少ToUserName");
			Exception ex=new Exception("不符合微信格式，缺少ToUserName");
			throw ex;
		}
		if (time==null||time.equals("")) {
			System.out.println("不符合微信格式，缺少CreateTime");
			Exception ex=new Exception("不符合微信格式，缺少CreateTime");
			throw ex;
		}
		if (type==null||type.equals("")) {
			System.out.println("不符合微信格式，缺少MsgType");
			Exception ex=new Exception("不符合微信格式，缺少MsgType");
			
			throw ex;
		}
		return true;
	}

	/**
	 * 获取微信格式的xml字符串
	 * @param map 包含微信格式的map
	 * @return 如果转换成功则返回xml字符串，否则返回null
	 */
	public String  getAWeiXmlByMapString(Map<String, Object>map) {
		try {
			if (isAgoodMapFormat((HashMap<String, Object>)map)) {
				Document doc=DocumentHelper.createDocument();
				Element root=doc.addElement("xml");
				if (!map.get("MsgType").equals("news")) {//不是图文信息格式
					for (Map.Entry<String, Object>tt  :map.entrySet() ) {
						Element child=root.addElement(tt.getKey());
						if (!isFormatCDATA((String)tt.getKey())) {
							child.addCDATA(""+tt.getValue());
						}else {
							child.setText(""+tt.getValue());
						}
						
					}
				}else {//是图文信息
					for (Map.Entry<String, Object>tt  :map.entrySet() ) {
						String tmpk=(String)tt.getKey();
						if (tmpk.equals("Articles")) {
							ArrayList<HashMap<String, String>>list=(ArrayList<HashMap<String, String>>) map.get("Articles");
							Element articles=root.addElement("Articles");
							for (HashMap<String, String> hashMap : list) {//处理多少个item
								Element item=articles.addElement("item");
								for (Map.Entry<String, String> dlis : hashMap.entrySet()) {//处理每一个item内容
									Element itemc=item.addElement(""+dlis.getKey());
									if (!isFormatCDATA(""+dlis.getKey())) {
										itemc.setText(""+dlis.getValue());
									}else {
										itemc.addCDATA(""+dlis.getValue());
									}
										
								}
								
							}
							
						}
						else {
							Element child=root.addElement(""+tt.getKey());
							if (!isFormatCDATA(""+tt.getKey())) {
								child.setText(""+tt.getValue());
							}else {
								child.addCDATA(""+tt.getValue());
							}
							
						}
						
					}
				}
			
				return	doc.asXML();
			
			}
		} catch (Exception e) {
			
			e.printStackTrace();
			
		}
		
		return null;
	}

	private boolean isFormatCDATA(String value) {
		String nameTTStr=value;
        if (nameTTStr.equals("CreateTime")||nameTTStr.equals("MsgId")||nameTTStr.equals("Location_X")||nameTTStr.equals("Location_Y")||nameTTStr.equals("Scale")) {
        	return true;
		}else if (nameTTStr.equals("Latitude")||nameTTStr.equals("Longitude")||nameTTStr.equals("Precision")||nameTTStr.equals("ArticleCount")) {
			return true;
		}else {
			System.out.println("加cdata："+value);
			return false;
		}
		
	}	

}
